/*
 * @Author: wrngygy
 * @Date: 2025-07-01
 * @Description: 验证工具函数
 */

/**
 * 判断是否为外部链接
 * @param path 路径
 * @returns 是否为外部链接
 */
export function isExternal(path: string): boolean {
	return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * 验证邮箱格式
 * @param email 邮箱地址
 * @returns 是否为有效邮箱
 */
export function isValidEmail(email: string): boolean {
	const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
	return emailRegex.test(email)
}

/**
 * 验证手机号格式
 * @param phone 手机号
 * @returns 是否为有效手机号
 */
export function isValidPhone(phone: string): boolean {
	const phoneRegex = /^1[3-9]\d{9}$/
	return phoneRegex.test(phone)
}

/**
 * 验证密码强度
 * @param password 密码
 * @returns 密码强度等级 (0-3)
 */
export function getPasswordStrength(password: string): number {
	let strength = 0
	
	// 长度检查
	if (password.length >= 8) strength++
	
	// 包含数字
	if (/\d/.test(password)) strength++
	
	// 包含小写字母
	if (/[a-z]/.test(password)) strength++
	
	// 包含大写字母或特殊字符
	if (/[A-Z]/.test(password) || /[!@#$%^&*(),.?":{}|<>]/.test(password)) strength++
	
	return strength
}

/**
 * 验证URL格式
 * @param url URL地址
 * @returns 是否为有效URL
 */
export function isValidURL(url: string): boolean {
	try {
		new URL(url)
		return true
	} catch {
		return false
	}
}

/**
 * 验证身份证号码
 * @param idCard 身份证号码
 * @returns 是否为有效身份证号码
 */
export function isValidIdCard(idCard: string): boolean {
	const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
	return idCardRegex.test(idCard)
}

/**
 * 验证用户名格式
 * @param username 用户名
 * @returns 是否为有效用户名
 */
export function isValidUsername(username: string): boolean {
	// 用户名只能包含字母、数字、下划线，长度3-20位
	const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/
	return usernameRegex.test(username)
}

/**
 * 验证IP地址格式
 * @param ip IP地址
 * @returns 是否为有效IP地址
 */
export function isValidIP(ip: string): boolean {
	const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
	return ipRegex.test(ip)
}

/**
 * 验证端口号
 * @param port 端口号
 * @returns 是否为有效端口号
 */
export function isValidPort(port: number | string): boolean {
	const portNum = typeof port === 'string' ? parseInt(port, 10) : port
	return Number.isInteger(portNum) && portNum >= 1 && portNum <= 65535
}
